from collections import defaultdict
from queue import Empty, Queue
from typing import Callable
from .event import Event
from .event_type import *

# 事件队列为空时，执行的回调函数
EmptyFunc = Callable[[any], bool]


class EventEngine:
    """
    事件引擎类
    """

    def __init__(self, debug: bool):
        """
        事件引擎
        :param debug: 是否打印事件日志
        """
        self._queue: Queue = Queue()  # 初始化事件队列
        self._handlers: defaultdict = defaultdict(list)  # 初始化处理器映射表
        self._debug: bool = debug

    def run(self, empty_func: EmptyFunc):
        """
        运行事件引擎
        :param empty_func: 事件队列为空时，执行的回调函数
        :return:
        """
        while True:
            try:
                event = self._queue.get(block=False)
                if event.type == OVER:
                    print(event)
                    break
                self._process(event)
            except Empty:
                empty_func(self)

    def _process(self, event: Event) -> None:
        """
        处理事件
        :param event: 事件
        :return:
        """
        if self._debug:
            print(event)
        [handler.process(event, self) for handler in self._handlers.get(event.type)]

    def put(self, event: Event) -> None:
        """
        添加事件到队列
        :param event: 事件
        :return:
        """
        self._queue.put(event)

    def register(self, event_type: str, handler: any) -> None:
        """
        注册事件处理器
        :param event_type: 事件类型
        :param handler: 时间处理器
        :return:
        """
        handler_list = self._handlers[event_type]
        if handler not in handler_list:
            handler_list.append(handler)
